﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using SmsVotes.DataAccess;

namespace SmsVotes.SmsVoting
{
    /// <summary>
    /// Контрол управления текущим голосованием
    /// </summary>
    public partial class CurrentVote : CommandControl
    {
        private VoteState State
        {
            get
            {
                int stateID = (int)ViewState["VoteStateID"];
                return StateManager.GetVoteStateByID(stateID);
            }
            set
            {
                ViewState["VoteStateID"] = value.ID;
            }
        }

        private int Priority
        {
            get
            {
                object p = ViewState["Priority"];
                if (p == null)
                    return 0;
                return (int)p;
            }
            set
            {
                ViewState["Priority"] = value;
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                int vid;
                if (int.TryParse(Request.QueryString["vid"], out vid))
                {
                    // 
                    

                    // получаем начатое голосование
                    DataAccess.Vote currentVote = VoteManager.GetByID(vid);
                    currentVote.Questions.SmartLoad(currentVote);

                    // получаем вопрос с приоритетом 0
                    var currentQuestion = (from q in currentVote.Questions where q.Priority == 0 select q).FirstOrDefault();
                    if (currentQuestion != null)
                    {
                        // создаем состояние голосования
                        var newVoteState = new VoteState() { CurrentQuestion = currentQuestion, Vote = currentVote, StartDateTime = DateTime.Now };
                        CreateStatesForAnswers(currentQuestion, newVoteState);

                        // Сохраняем все в БД
                        VoteManager.Save();
                        // запоминаем состояние голосования
                        State = newVoteState;

                        // Грузим контрол отображения вопроса
                        SetChartImgUrl(newVoteState);

                        lbVotePhone.Text = currentVote.Phone;
                        // Показывает ответы на текущий вопрос
                        BindAnswers(State);

                        RegisterChangeQuestionTimeoutScript(currentQuestion);
                    }
                    else
                        Response.Redirect("smsvoting.aspx", true);

                }

            }
        }
        /// <summary>
        /// Показывает ответы на текущий вопрос
        /// </summary>
        /// <param name="state">Текущее состояние, из которого берется вопрос</param>
        private void BindAnswers(VoteState state)
        {
            lvAnswers.DataSource = state.CurrentQuestion.Answers;
            lvAnswers.DataBind();
        }

        private void RegisterChangeQuestionTimeoutScript(SmsVotes.DataAccess.Question currentQuestion)
        {
            if ((currentQuestion.ChangeTime ?? 0) > 0)
            {
                ScriptManager.RegisterStartupScript(this, typeof(string), "changeQuestion", string.Format("setTimeout(nextQuestion,{0});", currentQuestion.ChangeTime * 1000), true);
            }
        }

        protected void lbtnEndVote_Click(object sender, EventArgs e)
        {
            EndVote();
        }

        protected void lblEndQuestion_Click(object sender, EventArgs e)
        {

        }



        protected void lbtnNextQuestion_Click(object sender, EventArgs e)
        {
            // увеличиваем приоритет на 1
            Priority++;
            // получаем следующий по приоритету вопрос
            var currentQuestion = (from q in State.Vote.Questions where q.Priority == Priority select q).FirstOrDefault();
            if (currentQuestion != null)
            {

                // обновляем состояние голосования, назначая новый текщий вопрос
                State.CurrentQuestion = currentQuestion;
                CreateStatesForAnswers(currentQuestion, State);
                // Сохраняем состояние в БД
                StateManager.Save();

                // опять грузим контрол
                SetChartImgUrl(State);
                BindAnswers(State);
                RegisterChangeQuestionTimeoutScript(currentQuestion);
            }
            else
            {
                EndVote();
            }

        }

        private void CreateStatesForAnswers(SmsVotes.DataAccess.Question currentQuestion, VoteState state)
        {
            // для каждого ответа создаем состояние, для подсчета количества ответов в данном голосовании
            currentQuestion.Answers.Load();
            foreach (var answer in currentQuestion.Answers)
            {
                state.AnswerStates.Add(new AnswerState() { Answer = answer, VoteState = state });
            }
        }
        /// <summary>
        /// Устанавливает урл, по которому будет генерится график текущаего состояния
        /// </summary>
        /// <param name="state">Состояние голосования, откуда тянется текущий вопрос</param>
        private void SetChartImgUrl(VoteState state)
        {
            imgChart.ImageUrl = "chart.axd?sid=" + state.ID;
        }
        /// <summary>
        /// Завершает текущее голосование и переходит на все станицу весх голосований
        /// </summary>
        private void EndVote()
        {
            State.Ended = true;
            State.EndDateTime = DateTime.Now;
            StateManager.Save();
            Response.Redirect(string.Format("SmsVoting.aspx?cmd=votehistory&sid={0}",State.ID), true);
        }

        protected void btnRefresh_Click(object sender, EventArgs e)
        {
            SetChartImgUrl(State);
        }
    }
}